#include <stdio.h>
#include <stdlib.h>
#include "tp2.h"
#define TRUE 1
#define FALSE 0

  int main(){
    int i=FALSE,j=FALSE,rexec=0,nreg=0, nSKtit=0, nSKtip=0, nSKaut=0, nSKano=0, a=0, aux, b ,nlistatit, nlistatip, nlistaaut, nlistaano, x=0, jaja=-1, lala=0,e=0;
    char rep,op, buffer[200], test[200], c;
    FILE *PKlist, *base, *listainvertida, *avail, *SKlist;
    PK *lista, *listaSKtitulo, *listaSKtipo, *listaSKautor, *listaSKano, *remove;
    PKlist=fopen("PKlist.dat","r");
    if(PKlist==NULL){
      PKlist=fopen("base20.dat","a+");
      lista=CarregaPKDaBase(&nreg,PKlist);
      fclose(PKlist);
    }
    else{
      lista=CarregaPK(&nreg,PKlist);
      fclose(PKlist);
    }
    SKlist=fopen("SKtitulo.dat","r");
    if(SKlist==NULL){
      base=fopen("base20.dat","r");
      listainvertida=fopen("listatitulo.dat","w");
      listaSKtitulo=CarregaSKDaBase(&nSKtit,&nlistatit, base, 200, listainvertida);
      fclose(base);
      fclose(listainvertida);
    }
    else{
      listaSKtitulo=CarregaSK(SKlist,&nSKtit);
      fclose(SKlist);
    }
    SKlist=fopen("SKtipo.dat","r");
    if(SKlist==NULL){
      base=fopen("base20.dat","r");
      listainvertida=fopen("listatipo.dat","w");
      listaSKtipo=CarregaSKDaBase(&nSKtip,&nlistatip, base, 100, listainvertida);
      fclose(base);
      fclose(listainvertida);
    }
    else{
      listaSKtipo=CarregaSK(SKlist,&nSKtip);
      fclose(SKlist);
    }
    SKlist=fopen("SKautor.dat","r");
    if(SKlist==NULL){
      base=fopen("base20.dat","r");
      listainvertida=fopen("listaautor.dat","w");
      listaSKautor=CarregaSKDaBase(&nSKaut,&nlistaaut, base, 125, listainvertida);
      fclose(base);
      fclose(listainvertida);
    }
    else{
      listaSKautor=CarregaSK(SKlist,&nSKaut);
      fclose(SKlist);
    }
    SKlist=fopen("SKano.dat","r");
    if(SKlist==NULL){
      base=fopen("base20.dat","r");
      listainvertida=fopen("listaano.dat","w");
      listaSKano=CarregaSKDaBase(&nSKano,&nlistaano, base, 4, listainvertida);
      fclose(base);
      fclose(listainvertida);
    }
    else{
      listaSKano=CarregaSK(SKlist,&nSKano);
      fclose(SKlist);
    }
    avail=fopen("availtitulo.dat","r");
    if(avail==NULL){
      avail=fopen("availtitulo.dat","w");
      fwrite(&jaja,1,4,avail);
    }
    fclose(avail);
    avail=fopen("availbase.dat","r");
    if(avail==NULL){
      avail=fopen("availbase.dat","w");
      fwrite(&jaja,1,4,avail);
    }
    fclose(avail);
    avail=fopen("availtipo.dat","r");
    if(avail==NULL){
      avail=fopen("availtipo.dat","w");
      fwrite(&jaja,1,4,avail);
    }
    fclose(avail);
    avail=fopen("availautor.dat","r");
    if(avail==NULL){
      avail=fopen("availautor.dat","w");
      fwrite(&jaja,1,4,avail);
    }
    fclose(avail);
    avail=fopen("availano.dat","r");
    if(avail==NULL){
      avail=fopen("availano.dat","w");
      fwrite(&jaja,1,4,avail);
    }
    fclose(avail);
    /*
    **** teste da adicionaSK ****
    scanf("%c",&c);
    while(c!='\n'){
      buffer[x]=c;
      scanf("%c",&c);
      x++;
    }
    while(x<200){
      buffer[x]=' ';
      x++;
    }
    while((buffer[a]!=' ')&&(a<200)){
      while((buffer[a]!=' ')&&(a<200)){
        test[e]=buffer[a];
        a++;
        e++;
      }
      while(e<200){
        test[e]=' ';
        e++;
      }
      e=0;
      a++;
      avail=fopen("availtitulo.dat","r+");
      base=fopen("listatitulo.dat","r+");
      AdicionaSK(test, buffer, listaSKtitulo, &nSKtit, base, avail, 200);
      fclose(base);
      fclose(avail);
    }
    /*
    **** fim do teste da adicionaSK ****
    */
    /*
    **** teste da remove ****
    scanf("%c",&c);
    while(c!='\n'){
      buffer[x]=c;
      scanf("%c",&c);
      x++;
    }
    while(x<200){
      buffer[x]=' ';
      x++;
    }
    x=0;
    remove=BSearch(lista,buffer,0,nreg-1);
    RemoveKeyTitulo(listaSKtitulo,buffer,&nSKtit,200);
    **** fim do teste da remove ****
    */
    /*for(x=0;x<nSKtit;x++){
      for(b=0;b<200;b++){
        printf("%c",listaSKtitulo[x].titulo[b]);
      }
      printf("\n");
      printf("%d\n",listaSKtitulo[x].NRR);
    }
    base=fopen("listatitulo.dat","r");
    fseek(base,0,0);
    a=0;
    while(fgets(buffer,200,base)!=NULL){
      fseek(base,a*204,0);
      fread(buffer,1,200,base);
      for(x=0;x<200;x++){
        printf("%c",buffer[x]);
      }
      printf("\n");
      fread(&lala,1,4,base);
      printf("%d\n",lala);
      a++;
    }
    fclose(base);
    //BuscaSK(listaSKtitulo,nSKtit);
  /*
   * O inteiro "rexec" funciona como um laco sem fim, para que sempre retorne no
   * principal, possibilitando outras verificacoes e insercoes, facilitando o
   * trabalho do usuario. 
   */
    while(rexec==0){
      printf("+-----------------------------------+\n");
      printf("|             OPCOES                |\n");
      printf("|===================================|\n");
      printf("|                                   |\n");
      printf("| (A): Inserir obra                 |\n");
      printf("| (B): Pesquisar ou remover obra    |\n");
      printf("| (C): Sair do programa             |\n");
      printf("| (D): AJUDA                        |\n");
      printf("|                                   |\n");
      printf("+-----------------------------------+\n\n");
      printf("Escolha a opcao:\n");
  /*
   * O inteiro "i" funciona como um verificador que,
   * quando confirmada a execu�ao com sucesso(i==1),
   * ele sai do la�o.
   */
      while(i==FALSE){
        scanf(" %c",&op);
        switch(op){
          case 'A':
            printf("\n");
            printf("Inserindo obra, digite os dados:\n\n");
            i=insere(&nreg,lista,&nSKtit,&nSKtip,&nSKaut,&nSKano,listaSKtitulo,listaSKtipo,listaSKautor,listaSKano);
            j=FALSE;
            break;
          case 'a':
            printf("\n");
            printf("Inserindo obra, digite os dados:\n\n");
            i=insere(&nreg,lista,&nSKtit,&nSKtip,&nSKaut,&nSKano,listaSKtitulo,listaSKtipo,listaSKautor,listaSKano);
            j=FALSE;
            break;
          case 'B':
            getchar();
            printf("\n");
            printf("Buscando obra, digite os dados:\n\n");
            j=Busca(lista,nreg);
            i=TRUE;
            break;
          case 'b':
            getchar();
            printf("\n");
            printf("Buscando obra, digite os dados:\n\n");
            j=Busca(lista,nreg);
            i=TRUE;
            break;
          case 'C':
            printf("\n");
            printf("Volte Sempre!\n");
            gravaPK(lista,nreg);
            base=fopen("SKtitulo.dat","w");
            gravaSK(base,listaSKtitulo,nSKtit);
            fclose(base);
            base=fopen("SKtipo.dat","w");
            gravaSK(base,listaSKtipo,nSKtip);
            fclose(base);
            base=fopen("SKautor.dat","w");
            gravaSK(base,listaSKautor,nSKaut);
            fclose(base);
            base=fopen("SKano.dat","w");
            gravaSK(base,listaSKano,nSKano);
            fclose(base);
            return 0;
          case 'c':
            printf("\n");
            printf("Volte Sempre!\n");
            gravaPK(lista,nreg);
            base=fopen("SKtitulo.dat","w");
            gravaSK(base,listaSKtitulo,nSKtit);
            fclose(base);
            base=fopen("SKtipo.dat","w");
            gravaSK(base,listaSKtipo,nSKtip);
            fclose(base);
            base=fopen("SKautor.dat","w");
            gravaSK(base,listaSKautor,nSKaut);
            fclose(base);
            base=fopen("SKano.dat","w");
            gravaSK(base,listaSKano,nSKano);
            fclose(base);
            return 0;
          case 'd':
            printf("\n");
            printf("Pressione A para inserir uma obra no banco de dados do arquivo\n");
            printf("Pressione B para pesquisar uma obra no banco de dados do arquivo\n");
            printf("Pressione C para sair do programa\n\n");
            printf("Escolha a opcao:\n");
            i=FALSE;
            j=FALSE;
            break;
          case 'D':
            printf("\n");
            printf("Pressione A para inserir uma obra no banco de dados do arquivo\n");
            printf("Pressione B para pesquisar uma obra no banco de dados do arquivo\n");
            printf("Pressione C para sair do programa\n\n");
            printf("Escolha a opcao:\n");
            i=FALSE;
            j=FALSE;
            break;
          default:
            printf("\n");
            printf("Opcao Invalida! Pressione (C) caso queira ver a opcao de AJUDA.\n");
            i=FALSE;
            j=FALSE;
            break;
        }
      }
      while(i==TRUE && j==FALSE){
        printf("Deseja adicionar uma nova obra ao registro?(S/N)\n");
        scanf(" %c",&rep);
        switch(rep){
          case 'S':
            printf("\n");
            printf("Inserindo obra, digite os dados:\n\n");
            i=insere(&nreg,lista,&nSKtit,&nSKtip,&nSKaut,&nSKano,listaSKtitulo,listaSKtipo,listaSKautor,listaSKano);
            break;
          case 's':
            printf("\n");
            printf("Inserindo obra, digite os dados:\n\n");
           i=insere(&nreg,lista,&nSKtit,&nSKtip,&nSKaut,&nSKano,listaSKtitulo,listaSKtipo,listaSKautor,listaSKano);
            break;
          case 'n':
            printf("\n");
            printf("Retornando a tela principal!\n\n");
            i=FALSE;
            break;
          case 'N':
            printf("\n");
            printf("Retornando a tela principal!\n\n");
            i=FALSE;
            break;
          default:
            printf("\n");
            printf("Opcao Invalida! Utilize somente (S) ou (N)!\n\n");
            i=TRUE;
            break;
        }
      }
      while(j==TRUE){
        printf("Deseja busca uma nova obra no registro?(S/N)\n");
        scanf(" %c",&rep);
        switch(rep){
          case 'S':
            getchar();
            printf("\n");
            printf("Buscando obra, digite os dados:\n\n");
            i=Busca(lista,nreg);
            break;
          case 's':
            getchar();
            printf("\n");
            printf("Buscando obra, digite os dados:\n\n");
            i=Busca(lista,nreg);
            break;
          case 'n':
            printf("\n");
            printf("Retornando a tela principal!\n\n");
            i=FALSE;
            j=FALSE;
            break;
          case 'N':
            printf("\n");
            printf("Retornando a tela principal!\n\n");
            i=FALSE;
            j=FALSE;
            break;
          default:
            printf("\n");
            printf("Opcao Invalida! Utilize somente (S) ou (N)!\n\n");
            i=TRUE;
            j=TRUE;
            break;
        }
      }
    }
    return 0;
  }
